package com.xk._04regEx;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description: 正则表达式--作业
 * @author: xu
 * @date: 2022/11/2 15:48
 */
public class Reg_HomeWork {
    public static void main(String[] args) {
        homeWork03();
    }

    /**
     * 验证 电子邮箱 的格式是否合法
     */
    private static void homeWork01() {
        /*
        * 规定电子邮箱的规格为：
        * 1. 只能有一个 @
        * 2. @ 前面是用户名，可以是 [ a-z A-Z 0-9 _ - ] 字符
        * 3. @ 后面是域名，并且域名只能是英文字母，比如 sohu.com 或者 tsinghua.org.cn
        * 4. 写出对应的正则表达式，验证输入的字符串是否为满足规则
        * */
        String content = "hsp@tsinghua.org.cn";
        String regStr = "^[\\w-]+@([a-zA-Z]+\\.)+[a-zA-Z]+$";
        if (content.matches(regStr)){
            System.out.println("匹配成功");
        } else {
            System.out.println("匹配失败");
        }
    }

    /**
     * 验证是不是 整数 或者 小数
     */
    private static void homeWork02() {
        /*
        * 验证是不是 整数 或者 小数
        * 提示：这个题要考虑整数和负数
        * 比如：123  -345  34.89  -87.9  -0.01  0.45
        *
        * 思路：
        * 1. 先写出简单的正则表达式
        * 2. 再逐步的完善[根据各种情况来完善]
        * */
        String content = "01.89";
        String regStr = "^[-+]?([1-9]\\d*|0)(\\.\\d+)?$";
        if (content.matches(regStr)){
            System.out.println("匹配成功，这是一个整数或者小数");
        } else {
            System.out.println("匹配失败");
        }
    }

    /**
     * 对一个url进行解析
     */
    private static void homeWork03() {
        /*
        * https://www.sohu.com:8080/abc/index.htm
        * 1. 要求得到的协议是什么？    https
        * 2. 域名是什么？            www.sohu.com
        * 3. 端口是什么？            8080
        * 4. 文件名是什么？          index.htm
        *
        * 思路：分组，4组，分别获取到对应的值
        * */
        // 因为正则表达式是根据要求来编写的，所以需求需要的话，可以改进
        String content = "https://www.sohu.com:8080/abc/xxx/yyy/////index.js.java.htm";
        String regStr = "^([a-zA-Z]+)://([a-zA-Z.]+):(\\d+)[\\w-/]*/([\\w.]+)$";
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);
        if (matcher.matches()){ // 整体匹配：如果匹配成功，可以通过group(x)，通过对应分组的内容
            System.out.println("匹配成功：" + matcher.group(0));
            System.out.println("协议：" + matcher.group(1));
            System.out.println("域名：" + matcher.group(2));
            System.out.println("端口号：" + matcher.group(3));
            System.out.println("文件名：" + matcher.group(4));
        } else {
            System.out.println("匹配失败");
        }
    }

    // 说明：
    // 1. String 的 matches 是整体匹配
    // 2. 看看 String.matches 的源码
    //      String.matches：
    //      public boolean matches(String regex) {
    //          return Pattern.matches(regex, this);
    //      }
    //
    //      Pattern.matches：
    //      public static boolean matches(String regex, CharSequence input) {
    //          Pattern p = Pattern.compile(regex);
    //          Matcher m = p.matcher(input);
    //          return m.matches();
    //      }
    //
    //      Matcher.matches：
    //      public boolean matches() {
    //          return match(from, ENDANCHOR);
    //      }
}
